package com.bawei.module_apps.local

import android.util.Log
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import com.alibaba.android.arouter.facade.annotation.Route
import com.baidu.location.BDAbstractLocationListener
import com.baidu.location.BDLocation
import com.baidu.location.LocationClient
import com.baidu.location.LocationClientOption
import com.baidu.mapapi.model.LatLng
import com.baidu.mapapi.utils.DistanceUtil
import com.bawei.library_mvi.ui.BaseMviActivity
import com.bawei.module_apps.R
import com.bawei.module_apps.databinding.ActivityLocalAppBinding
import com.bw.quickadapter.BaseQuickAdapter
import io.virtualapp.hook_sdk.app.InstallAppUtils
import kotlinx.coroutines.launch


@Route(path = "/apps/local")
class LocalAppActivity : BaseMviActivity<ActivityLocalAppBinding>() {
    private lateinit var viewModel: LocalAppsViewModel
    private lateinit var  adapter:LocalAppsAdapter
    private var flag = false //是否在公司范围内
    var mLocationClient: LocationClient? = null
    private val myListener = MyLocationListener()
    private val installAppUtils : InstallAppUtils by lazy { InstallAppUtils() } //虚拟机工具类

    var targetLatLng = LatLng(23.4567, 45.6789)
    override fun handleState() {
        lifecycleScope.launch{
            viewModel.states.collect{
                when(it){
                    is LocalAppState.Init ->{}
                    is LocalAppState.LocalAppSuccess ->{
                        val datas = it.datas
                        adapter.setNewInstance(datas)//数据刷新
                    }
                    else -> {}
                }

            }
        }

    }

    override fun initData() {
        super.initData()
        lifecycleScope.launch{
            viewModel.intents.send(LocalAppsIntent.LocalAppsDataIntent)//发送意图给viewmodel
        }
    }



    override fun initView() {
        super.initView()
        viewDataBinding.localAppsBar.backImg.setOnClickListener { finish() }
        viewDataBinding.localAppsBar.titleTv.text = "本地应用"
        adapter = LocalAppsAdapter()
        val manager = GridLayoutManager(this,3)
        manager.orientation = GridLayoutManager.VERTICAL
        viewDataBinding.localAppsRv.layoutManager = manager
        //注意！！！！ 适配器最后设置
        viewDataBinding.localAppsRv.adapter = adapter
        viewDataBinding.localAppsRv.setHasFixedSize(true)
        //点击item打开app:判断手机的位置是否在使用范围内
        adapter.setOnItemCLickListener(object :BaseQuickAdapter.OnItemCLickListener{
            override fun onItemClick(adapter: BaseQuickAdapter<*>?, position: Int) {
//                if (!flag){
//                    Log.e("ZXY","不在使用范围内")
//                    ToastUtils.showShort("不在使用范围内")
//                    return
//                }

                val localAppsAdapter = adapter as LocalAppsAdapter
                val packageName = localAppsAdapter.data.get(position).packageName
                //打开app
                val launchApp = installAppUtils.launchApp(packageName)
                Log.d("ytx", "launchApp: $launchApp")
            }
        })
        initLocation()
    }

    override fun getLayout(): Int {
        return R.layout.activity_local_app
    }

    override fun generateViewModel() {
        viewModel = ViewModelProvider(this).get(LocalAppsViewModel::class.java)
    }
    //使用百度地图定位功能
    private fun initLocation(){
        mLocationClient =  LocationClient(getApplicationContext())
        //声明LocationClient类
        mLocationClient!!.registerLocationListener(myListener)
        val option : LocationClientOption =  LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);
        //可选，设置定位模式，默认高精度
        //LocationMode.Hight_Accuracy：高精度；
        //LocationMode. Battery_Saving：低功耗；
        //LocationMode. Device_Sensors：仅使用设备；
        //LocationMode.Fuzzy_Locating, 模糊定位模式；v9.2.8版本开始支持，可以降低API的调用频率，但同时也会降低定位精度；
        option.setCoorType("bd09ll");
        //可选，设置返回经纬度坐标类型，默认GCJ02
        //GCJ02：国测局坐标；
        //BD09ll：百度经纬度坐标；
        //BD09：百度墨卡托坐标；
        //海外地区定位，无需设置坐标类型，统一返回WGS84类型坐标
        option.setScanSpan(1000)
//可选，设置发起定位请求的间隔，int类型，单位ms
//如果设置为0，则代表单次定位，即仅定位一次，默认为0
//如果设置非0，需设置1000ms以上才有效
//可选，设置是否使用卫星定位，默认false
//使用高精度和仅用设备两种定位模式的，参数必须设置为true
        option.setIgnoreKillProcess(false);
//可选，定位SDK内部是一个service，并放到了独立进程。
//设置是否在stop的时候杀死这个进程，默认（建议）不杀死，即setIgnoreKillProcess(true)
        option.SetIgnoreCacheException(false);
//可选，设置是否收集Crash信息，默认收集，即参数为false
        option.setWifiCacheTimeOut(5*60*1000);
//可选，V7.2版本新增能力
//如果设置了该接口，首次启动定位时，会先判断当前Wi-Fi是否超出有效期，若超出有效期，会先重新扫描Wi-Fi，然后定位
//        option.setEnableSimulateGnss(false);
//可选，设置是否需要过滤卫星定位仿真结果，默认需要，即参数为false
        option.setNeedNewVersionRgc(true);
//可选，设置是否需要最新版本的地址信息。默认需要，即参数为true
        mLocationClient!!.setLocOption(option);
//mLocationClient为第二步初始化过的LocationClient对象
//需将配置好的LocationClientOption对象，通过setLocOption方法传递给LocationClient对象使用
//更多LocationClientOption的配置，请参照类参考中LocationClientOption类的详细说明
        mLocationClient!!.start()
    }

    override fun onStop() {
        super.onStop()
        mLocationClient!!.stop()
    }

    inner class MyLocationListener: BDAbstractLocationListener() {
        override fun onReceiveLocation(location : BDLocation){
            val latitude: Double = location.getLatitude() //获取纬度信息
            val longitude: Double = location.getLongitude() //获取经度信息

            Log.e("ZXY", "latitude:$latitude&&longitude:$longitude")

            val distance = DistanceUtil.getDistance(targetLatLng, LatLng(latitude, longitude))
            if(distance < 1000){
                flag = true
            }

        }
    }


}